package com.booter.gateway.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.config.WebFluxConfigurer;

/***
 * 默认的缓冲区为256K
 * org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
 *1：REST API接口返回JSON超过256K时报错；
 *2：下载文件接口(返回二进制文件流，Content-Type为application/octet-stream)文件超过256K时报错。
 *3: 提交的报文过大
 * 以下方式在spring boot 2.2以上版本失效，通过spring.codec.max-in-memory-size 调整缓冲区也已经师兄啊
 * spring.codec.max-in-memory-size=20MB
 *
 * 解决方法
 * 1 通过Jackson的@JsonInclude(JsonInclude.Include.NON_NULL) 注解在接口返回的JSON中过滤掉为 null的字段，以限制接口返回JSON的大小
 * 2 如果网关的拦截器（Filter）中操作了HTTP body，也可能会出现DataBufferLimitException的问题
 * 3 对Content-Type为application/octet-stream时（返回二进制流时），不在网关的拦截器（Filter）中操作HTTP body来避免缓冲区溢出错误
 * */
@Configuration
//@EnableWebFlux
public class WebFluxWebConfig implements WebFluxConfigurer {
    @Override
    public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
        configurer.defaultCodecs().maxInMemorySize(2000 * 1024 * 1024);
    }
}
